#include <stdio.h>
 
typedef struct {
    int i,j,value;
}Node;
typedef struct{
    Node data[10001];
    int m,n,r;
} Matrix;
 
Matrix create();
void printH(Matrix M);
void printL(Matrix M);
Matrix trans(Matrix M);
Matrix add(Matrix M,Matrix T);
int getvalue(int i,int j,Matrix M);
Matrix mul(Matrix M,Matrix T);
 
int main(){
    Matrix M,T,transM,addM,mulM;
    M=create();
    T=create();
    char c,ch;
    scanf("%c%c",&c,&ch);
    transM=trans(M);
    printf("The transformed matrix is:\n");
    if(ch=='H'){
        printH(transM);
    }else{
        printL(transM);
    }
    addM=add(M,T);
    if(addM.r==-1){
        printf("Can not add!\n");
    }else{
    	printf("The added matrix is:\n");
        if(ch=='H'){
            printH(addM);
        }else{
            printL(addM);
        }
    }
    mulM=mul(M,T);
    if(mulM.r==-1){
        printf("Can not multiply!\n");
    }else{
    	printf("The product matrix is:\n");
        if(ch=='H'){
            printH(mulM);
        }else{
            printL(mulM);
        }
    }
}
Matrix create(){
    Matrix M;
    scanf("%d %d %d",&M.m,&M.n,&M.r);
    M.data[0].i=-1;
    M.data[0].j=-1;
    M.data[0].value=-1;
    for(int k=1;k<=M.r;k++){
        scanf("%d %d %d",&M.data[k].i,&M.data[k].j,&M.data[k].value);
    }
    return M;
}
void printH(Matrix M){
    int k=1;
    printf("    ");
    for(int p=1;p<=M.n;p++){
        printf("%4d",p);
    }
    printf("\n");
    for(int p=1;p<=M.m;p++){
        printf("%4d",p);
        for(int q=1;q<=M.n;q++){
           if(p==M.data[k].i&&q==M.data[k].j){
               printf("%4d",M.data[k].value);
               k++;
           } else{
               printf("%4d",0);
           }
        }
        printf("\n");
    }
}
void printL(Matrix M){
    printf("Rows=%d,Cols=%d,r=%d\n",M.m,M.n,M.r);
    for(int p=1;p<=M.r;p++){
        printf("%d %d %d\n",M.data[p].i,M.data[p].j,M.data[p].value);
    }
}
Matrix trans(Matrix M){
    Matrix T;
    int num[10001];
    int cpot[10001];
    int p,q,col;
    T.n=M.m;
    T.m=M.n;
    T.r=M.r;
    if(T.r){
        for(p=0;p<=M.n;p++){
            num[p]=0;
            cpot[p]=0;
        }
        for(p=1;p<=M.r;p++){
            num[M.data[p].j]++;
        }
        cpot[1]=1;
        
        for(p=2;p<=M.n;p++){
            cpot[p]=cpot[p-1]+num[p-1];
           // printf("%d %d %d %d\n",p,cpot[p-1],num[p-1],cpot[p]);
        }
        for(p=1;p<=M.r;p++){
            col=M.data[p].j;
            q=cpot[col];
            
          //  printf("%dhahah%d\n",q,col); 
            T.data[q].i=M.data[p].j;
            T.data[q].j=M.data[p].i;
            T.data[q].value=M.data[p].value;
            cpot[col]++;
        }
    }
    return T;
}
 
Matrix add(Matrix M,Matrix T){
    
    Matrix N;
    int r=1,r1=1,r2=1;
    if(M.m!=T.m||M.n!=T.n){
        N.r=-1;
        return N; 
    }
    N.m=M.m;
    N.n=M.n;
    //printf("%d%d",M.r,T.r);
    while(r1<=M.r && r2<=T.r){
        if(M.data[r1].i<T.data[r2].i||M.data[r1].i==T.data[r2].i&&M.data[r1].j<T.data[r2].j){
            N.data[r].i=M.data[r1].i;
            N.data[r].j=M.data[r1].j;
            N.data[r].value=M.data[r1].value;
            r++;
            r1++;
           // printf("11%d%d\n",r,r1); 
        }
        else if(M.data[r1].i>T.data[r2].i||M.data[r1].i==T.data[r2].i&&M.data[r1].j>T.data[r2].j)
        {
            N.data[r].i=T.data[r2].i;
            N.data[r].j=T.data[r2].j;
            N.data[r].value=T.data[r2].value;
            r++;
            r2++;
          //  printf("22%d%d\n",r,r2);
        }else{
		    if(T.data[r2].value+M.data[r1].value!=0){
	            N.data[r].i=T.data[r2].i;
	            N.data[r].j=T.data[r2].j;
	            N.data[r].value=T.data[r2].value+M.data[r1].value;
	            r++;
	            r2++;
	            r1++;
			//	printf("33%d%d%d\n",r,r1,r2);
			}else{
				r1++;
				r2++;
			}
    	}
    }
    while(r1<=M.r){
        N.data[r].i=M.data[r1].i;
        N.data[r].j=M.data[r1].j;
        N.data[r].value=M.data[r1].value;
        r++;
        r1++;
        //printf("%d%d",r,r1); 
    }
    while(r2<=T.r){
        N.data[r].i=T.data[r2].i;
        N.data[r].j=T.data[r2].j;
        N.data[r].value=T.data[r2].value;
        r++;
        r2++;
       // printf("%d%d",r,r2);
    }
    N.r=r-1;
    return N; 
}
int getvalue(int i,int j,Matrix M){
    if(i>M.m||j>M.n)
        return 0;
    for(int p=1;p<=M.r;p++){
        if(i==M.data[p].i&&j==M.data[p].j)
            return M.data[p].value;
    }
    return 0;
}
Matrix mul(Matrix M,Matrix T){
    Matrix N;
    int x=1,y=1,z=1,sum;
    if(M.n!=T.m){
        N.r=-1;
        return N;
    }
    N.m=M.m;
    N.n=T.n;
    N.r=1;
    for(x=1;x<=M.m;x++){
        for(y=1;y<=T.n;y++){
            sum=0;
            for(z=1;z<=T.m;z++){
                sum+=getvalue(x,z,M)*getvalue(z,y,T);
            }
            if(sum!=0){
                N.data[N.r].i=x;
                N.data[N.r].j=y;
                N.data[N.r].value=sum;
                N.r++;
            }
        }
    }
    N.r;
    return N;
}